package com.pet.backend.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pet.backend.pojo.User;
import com.pet.backend.pojo.UserBackend;
import com.pet.backend.pojo.Vo;
import com.pet.backend.service.impl.UserServiceImpl;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 *  用户
 * </p>
 *
 * @author pet
 * @since 2024-07-13
 */
@CrossOrigin
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserServiceImpl userService;

    // 搜索
    @GetMapping("/search/{name}/{current}")
    public Vo<User> search(@PathVariable("name") String name, @PathVariable("current") Integer current){
        if (name.equals("")){
            return new Vo<>();
        }
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(User::getName,name);
        Page<User> userPage = new Page<>(current <= 0 ? 1 : current,6);
        IPage<User> page = userService.page(userPage, wrapper);
        if (page.getTotal() == 0){
            // 表示没有数据
            return new Vo<>();
        }
        List<User> users = page.getRecords();
        // 总条数
        long total = page.getTotal();
        // 当前页
        long pageCurrent = page.getCurrent();
        // 返回
        return new Vo<>(true,users,pageCurrent,total);
    }
    // 分页查询
    @GetMapping("/page/{current}")
    public Vo<User> page(@PathVariable("current") Integer current) {
        Page<User> userPage = new Page<>(current >= 0 ? current : 1, 6);
        IPage<User> page = userService.page(userPage);
        if (page.getTotal() == 0) {
            // 表示没有数据直接返回
            return new Vo<>(false, "目前没有用户！");
        }
        // 数据
        List<User> users = page.getRecords();
        // 当前页
        long curr = page.getCurrent();
        // 总记录数
        long total = page.getTotal();
        // 返回
        return new Vo<>(true, users, curr, total);
    }
    // 修改
    @PostMapping("/updateUser")
    public Vo<User> updateUser(@RequestBody User user){
        boolean b = userService.updateById(user);
        if (b){
            return new Vo<>(b,"修改成功！");
        }else {
            return new Vo<>(b,"修改失败，请稍后重试");
        }
    }
    // 删除
    @GetMapping("/delete/{id}")
    public Vo<User> delete(@PathVariable("id") String id){
        boolean b = userService.removeById(id);
        if (b){
            return new Vo<>(b,"删除成功！");
        }else {
            return new Vo<>(b,"删除失败，请稍后重试！");
        }
    }

    // 查看单个用户
    @GetMapping("/queryUser/{id}")
    public Vo<User> queryUser(@PathVariable("id") String id) {
        User user = userService.getById(id);
        return new Vo<>(user);
    }

    // 充值余额
    @GetMapping("/insertBalance/{id}/{balance}")
    public Vo<User> insertBalance(@PathVariable("id") String id, @PathVariable("balance") BigDecimal balance){
        User user =new User();
        user.setId(id);
        user.setBalance(balance);
        boolean b = userService.updateById(user);
        if (b){
            return new Vo<>(b,"充值成功！");
        }else {
            return new Vo<>(b,"充值失败，请稍后重试！");
        }
    }

    // 登录
    @PostMapping("/login")
    public Vo<User> login(@RequestBody User user) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(StringUtils.isNotBlank(user.getAccount()), User::getAccount, user.getAccount());
        wrapper.eq(StringUtils.isNotBlank(user.getPassword()), User::getPassword, user.getPassword());
        User one = userService.getOne(wrapper);
        if (one == null) {
            return new Vo<>(false, "账号或者密码错误！");
        }
        return new Vo<>(one.getId() + "", true);
    }

    // 修改密码
    @PostMapping("/updatePassword")
    private Vo<User> updatePassword(@RequestBody User user) {
        UpdateWrapper<User> wrapper = new UpdateWrapper<>();
        wrapper.eq("id", user.getId());
        // 这里是暂时使用name来存储旧的密码，用于做判断
        wrapper.eq(StringUtils.isNotBlank(user.getName()), "password", user.getName());
        // 需要设置的新密码
        wrapper.set("password", user.getPassword());
        boolean b = userService.update(wrapper);
        if (b) {
            return new Vo<>(b, "修改成功，请重新进行登录");
        } else {
            return new Vo<>(b, "修改失败，请稍后重试！");
        }
    }

    // 注册
    @PostMapping("/register")
    private Vo<User> register(@RequestBody User user) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(StringUtils.isNotBlank(user.getAccount()), User::getAccount, user.getAccount());
        User backend = userService.getOne(wrapper);
        //判断这个账号是否已经注册，如果已经被注册，那就不允许注册
        if (backend == null) {
            boolean b = userService.save(user);
            if (b) {
                return new Vo<>(b, "注册成功，请进行登录！");
            } else {
                return new Vo<>(b, "注册失败，请稍后重试！");
            }
        } else {
            // 这里表示已经注册了
            return new Vo<>(false, "该用户已经存在!");
        }
    }
}
